#ifndef __QE_GRAPH_H__
#define __QE_GRAPH_H__



#include "qe_def.h"



typedef void * qe_graph;



qe_graph *
qe_graph_new(void);

qe_graph *
qe_graph_new_full(qe_val_str v_str_func, qe_destroy_notify v_destroy_func);

qe_uint 
qe_graph_v(qe_graph *graph);

qe_uint 
qe_graph_e(qe_graph *graph);

qe_array *
qe_graph_adj(qe_graph *graph, qe_const_ptr v);

qe_ret 
qe_graph_add_vertex(qe_graph *graph, qe_const_ptr v);

void 
qe_graph_remove_vertex(qe_graph *graph, qe_const_ptr v);

qe_ret 
qe_graph_add_edge(qe_graph *graph, qe_const_ptr v, qe_const_ptr w);

void
qe_graph_remove_edge(qe_graph *graph, qe_const_ptr v, qe_const_ptr w);

qe_uint qe_graph_degree(qe_graph *graph, qe_const_ptr v);

qe_uint qe_graph_max_degree(qe_graph *graph);

void qe_graph_print(qe_graph *graph);

void qe_graph_destroy(qe_graph *graph);



#endif /* __QE_GRAPH_H__ */